package org.ManagerSystem.services.Impl;

import org.ManagerSystem.DAO.EmployeeDAO;
import org.ManagerSystem.DTO.LoginResult;
import org.ManagerSystem.DTO.PageBean;
import org.ManagerSystem.entity.Employee;
import org.ManagerSystem.enums.LoginStateEnum;
import org.ManagerSystem.services.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 用来处理与员工相关的业务的服务层的实现类
 * @author 群威
 */
@Service
//如果不加 @Service ，那么相关的 Controller 中不能实现自动注入，需要相应的 setter 方法
public class EmployServiceImpl implements EmployeeService{

    /**
     * 这里在自动装配的时候遇到了一个问题：
     *     在按照原先常用的方法将 DAO 的实现和注入的工作都交给 org.mybatis.spring.mapper.MapperScannerConfigurer
     *     处理的时候，发现 EmployeeDAO 无法自动装配，问题为 NO beans of 'EmployeeDAO' type found
     *
     * 分析了下原因，应该是：
     *     1.在这里的环境配置中，mybatis 和 springMVC 的配合上出现了问题，导致 mybatis 创建的实例没有被注入到 springMVC 中
     *     2.想了下可能是 springMVC 自动扫描上的问题，但是 MapperScannerConfigurer 中已经配置了 basePackage
     *     3.后来想到 2 中 spring-dao.xml 最先被加载，springMVC 的自动扫描是否已经有效了呢?
     *     4.然后在 spring-web.xml 中加了一条包扫描语句 <context:component-scan base-package="org.ManagerSystem.DAO"/>
     *     5.又在 DAO 接口上加了 @Repository 标注，问题解决
     */
    @Autowired
    private EmployeeDAO employeeDAO;

    @Override
    public LoginResult login(Employee employee) {
        Map<String , Object> paramsMap = new HashMap<String , Object>();
        paramsMap.put("eusername",employee.getEusername());
        paramsMap.put("epassword",employee.getEpassword());
        paramsMap.put("login_result",null);
        try {
            employeeDAO.login(paramsMap);
            int result = (int) paramsMap.get("login_result");
            if (result == -2) {
                return new LoginResult(false, LoginStateEnum.stateOf(result).getStateInfo());
            } else if (result == -1) {
                return new LoginResult(false, LoginStateEnum.stateOf(result).getStateInfo());
            } else if (result == 1) {
                return new LoginResult(true);
            } else {
                return new LoginResult(false, LoginStateEnum.UNKNOW_ERROR.getStateInfo());
            }
        }catch (Exception e){
            return new LoginResult(false , LoginStateEnum.INNER_ERROR.getStateInfo());
        }
    }

    @Override
    public Employee queryByEusername(String eusername) {
        return employeeDAO.queryByEusername(eusername);
    }

    //分页查询部门的人员
    @Override
    public PageBean<Employee> employeeList(int rid , int currentPage , long did) {

        //设置每页显示的员工记录数
        int pageSize = 5;
        int totalCount = 0;
        double tc;
        Double totalPage = null;
        int start = 0 ;
        List<Employee> list;
        PageBean<Employee> pageBean = new PageBean<Employee>();

        //查询总员工数并计算总共需要多少页
        totalCount = employeeDAO.findCount(did);
        tc = totalCount;
        totalPage = Math.ceil(tc/pageSize);
        //设置分页查询时的开始值
        start = pageSize*(currentPage-1);
        //保存分页查询得到的员工记录集合
        list = employeeDAO.employeeList(start,pageSize,did);

        //将得到的数据封装到 pageBean 中
        pageBean.setRid(rid);
        pageBean.setDid(did);
        pageBean.setCurrentPage(currentPage);
        pageBean.setPageSize(pageSize);
        pageBean.setTotalPage(totalPage.intValue());
        pageBean.setTotalCount(totalCount);
        pageBean.setList(list);

        return pageBean;
    }

    @Override
    public String queryExist(Employee employee) {
        if(employeeDAO.queryByEnumber(employee.getEnumber().trim()) !=0){
            return "-1";
        }
        if(employeeDAO.queryByEusername(employee.getEusername()) != null){
            return "-2";
        }
        return "1";
    }

    @Override
    @Transactional
    public void save(Employee employee) {
        employeeDAO.save(employee);
    }

    @Override
    public Employee queryById(long eid) {
        return employeeDAO.queryById(eid);
    }

    @Override
    @Transactional
    public void update(Employee employee) {
        employeeDAO.update(employee);
    }

    @Override
    @Transactional
    public void deleteById(long eid) {
        employeeDAO.deleteById(eid);
    }

    @Override
    @Transactional
    public void updatePassword(Employee employee) {
        employeeDAO.updatePassword(employee);
    }
}
